package com.tinet.trainee.bean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import cl.tinet.trainee.tarea6.Usuario;
import cl.tinet.trainee.tarea6.UsuarioDao;
import cl.tinet.trainee.tarea6.UsuarioDaoInterfaz;
import cl.tinet.trainee.tarea6.exception.UsuarioException;
import cl.tinet.trainee.tarea6.exception.UsuarioExisteException;
import cl.tinet.trainee.tarea6.exception.UsuarioNoExisteException;

//Objeto queda persistente el bean
@Stateless(mappedName = "UsuarioBean", name = "UsuarioBean")
public class UsuarioBeanImpl implements UsuarioBean {
	private List<Usuario> usuarios = new ArrayList<Usuario>();
	/**
	 * Instancia de la clase UsuarioDao.
	 */
	private UsuarioDaoInterfaz dao;
	/**
	 * Contendra la clave del error capturado.
	 */
	private String keyException;
	/**
	 * Nombre de la persistencia que esta haciendo la conexion a al BD.
	 */
	@PersistenceContext(unitName = "MySqlDS")
	private EntityManager em;

	@Resource
	SessionContext ctx;

	@PostConstruct
	private void init() {
		if (dao == null) {
			dao = new UsuarioDao(em);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public Usuario buscarUsuarioBean(Usuario datosUsuario) {
		Usuario usuario = dao.buscarUsuario(datosUsuario);
		return usuario;
	}

	/**
	 * {@inheritDoc}
	 */
	public void modificarUsuarioBean(Usuario datoUsuario) {
		Usuario userDb = dao.buscarUsuario(datoUsuario);
		userDb.updateDataUser(datoUsuario);
	}

	/**
	 * {@inheritDoc}
	 */
	public void eliminarUsuarioBean(Usuario datoUsuario) {
		Usuario user = dao.buscarUsuario(datoUsuario);
		//Si no lo encuentra no res
		dao.borrarUsuario(user);

	}

	/**
	 * {@inheritDoc}
	 */
	public void buscarUsuarioAgregado(Usuario datosUsuario)
			throws UsuarioException {
		Usuario usuario = dao.buscarUsuarioAntesDeCrear(datosUsuario);
		if (usuario != null) {
			throw new UsuarioExisteException(UsuarioExisteException.EXISTE);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void agregarUsuarioBean(Usuario datosUsuario) {
		dao.agregarUsuario(datosUsuario);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Usuario> buscarUsuarios(Usuario datosUsuario) {
		List<Usuario> listaUsuarios = dao.buscarListaUsuarios(datosUsuario);
		return listaUsuarios;
	}

	public EntityManager getEm() {
		return em;
	}

	public void setEm(EntityManager em) {
		this.em = em;
	}

/*	
	public boolean agregar(Usuario usuario) {
		boolean res = false;
		try {
			buscarUsuario2(usuario);
		} catch (UsuarioNoExisteException e) {
			usuarios.add(usuario);
			res = true;
		}
		return res;
	}
	
	public Usuario buscarUsuario2(Usuario usuario)
			throws UsuarioNoExisteException {

		Usuario found = null;
		for (Usuario user : usuarios) {
			if (usuario.equals(user)) {
				found = user;
				break;
			}
		}
		if (found == null) {
			throw new UsuarioNoExisteException(UsuarioNoExisteException.NO_EXISTE);
		}

		return found;
	}	
	    */
	/**
	 * {@inheritDoc}
	 */
	public List<Usuario> listar() {
		return usuarios;
	}
}
